package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.FichaContaBancariaDAO;
import br.com.duosoftware.orcamento.daos.TipoBancoDAO;
import br.com.duosoftware.orcamento.daos.TipoContaDAO;
import br.com.duosoftware.orcamento.daos.UnidadeGestoraDAO;
import br.com.duosoftware.orcamento.daos.VinculoDAO;
import br.com.duosoftware.orcamento.entidades.FichaContaBancaria;
import br.com.duosoftware.orcamento.entidades.TipoBanco;
import br.com.duosoftware.orcamento.entidades.TipoConta;
import br.com.duosoftware.orcamento.entidades.UnidadeGestora;
import br.com.duosoftware.orcamento.entidades.Vinculo;
import br.com.duosoftware.orcamento.services.FichaContaBancariaService;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 * 
 */
@ManagedBean
@ViewScoped
public class FichaContaBancariaBean implements Serializable {

    private FichaContaBancaria fichaContaBancaria;
    private List<FichaContaBancaria> fichasContaBancaria;
    private FichaContaBancariaDAO fichaContaBancariaDAO;
    private FichaContaBancariaService fichaContaBancariaService;
    //
    ///****Select Itens****
    //
    private List<SelectItem> unidadesGestoras;
    private List<SelectItem> tiposBanco;
    private List<SelectItem> tiposConta;
    private List<SelectItem> vinculos;
    //
    
    public FichaContaBancariaBean() {
        
        fichaContaBancariaService = new FichaContaBancariaService();
        
        fichaContaBancariaDAO = new FichaContaBancariaDAO();
        
    }

    public FichaContaBancaria getFichaContaBancaria() {
        return fichaContaBancaria;
    }

    public void setFichaContaBancaria(FichaContaBancaria fichaContaBancaria) {
        this.fichaContaBancaria = fichaContaBancaria;
    }

    public List<FichaContaBancaria> getFichasContaBancaria() {
        
        if(fichasContaBancaria == null){
            
            fichasContaBancaria = fichaContaBancariaDAO
                    .listarFichasContaBancaria();
            
        }
        
        return fichasContaBancaria;
    }

    public void setFichasContaBancaria(List<FichaContaBancaria> fichasContaBancaria) {
        this.fichasContaBancaria = fichasContaBancaria;
    }

    public FichaContaBancariaService getFichaContaBancariaService() {
        return fichaContaBancariaService;
    }

    public void setFichaContaBancariaService(FichaContaBancariaService fichaContaBancariaService) {
        this.fichaContaBancariaService = fichaContaBancariaService;
    }

    /**
     * <b>Método que inicializa a fichaContaBancaria a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        fichaContaBancaria = new FichaContaBancaria();
        fichaContaBancaria.setFicha(fichaContaBancariaDAO.obterSequenciaFichaExtra());
        
    }

    /**
     * <b>Método que adiciona ou edita uma FichaContaBancaria</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     * 
     * @return void
     *
     */
    public void adicionarEditarFim() {

        fichaContaBancariaDAO.salvarOuAtualizar(fichaContaBancaria);
        fichaContaBancaria = new FichaContaBancaria();
        fichasContaBancaria = null;
        
        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgFichaContaBancaria.hide()");
        requestContext.update("formFichasContaBancaria:dtFichasContaBancaria");

    }

    /**
     * <b>Método para iniciar o processo de edição de um FichaContaBancaria.</b> <p>
     *
     * Ele verifica se há um FichaContaBancaria selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um FichaContaBancaria selecionado o médoto abre o dialog para
     * edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (fichaContaBancaria == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        }else{
        
            RequestContext.getCurrentInstance().execute("dlgFichaContaBancaria.show()");
            
        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um FichaContaBancaria.</b> <p>
     *
     * Ele verifica se há uma FichaContaBancaria selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um FichaContaBancaria selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (fichaContaBancaria == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirFichaContaBancaria.show()");
        }

    }

    /**
     * <b>Método para excluir um FichaContaBancaria.</b> <p>
     *
     * Ele verifica se a FichaContaBancaria selecionado para exclusão está sendo 
     * utilizado por alguma outra tabela do banco. Se estiver uma mensagem de 
     * aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            fichaContaBancariaDAO.excluir(fichaContaBancaria);
            fichaContaBancaria = new FichaContaBancaria();
            fichasContaBancaria = null;
            
        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }
        
        RequestContext.getCurrentInstance()
                    .execute("dlgExcluirFichaContaBancaria.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável FichaContaBancaria para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        fichaContaBancaria = new FichaContaBancaria();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgFichaContaBancaria.hide()");
        requestContext.update("formFichaContaBancaria:dtFichasContaBancaria");

    }
    
    //
    //get SelectItens
    //
    public List<SelectItem> getUnidadesGestoras() {

        unidadesGestoras = new LinkedList<SelectItem>();

        for (UnidadeGestora unidadeGestora : new UnidadeGestoraDAO()
                .listarUnidadesGestoras()) {

            unidadesGestoras.add(new SelectItem(unidadeGestora, unidadeGestora.toString()));

        }

        return unidadesGestoras;

    }

    public List<SelectItem> getTiposBanco() {
        
        if(tiposBanco == null){
        
            tiposBanco = new LinkedList<SelectItem>();
            
            for(TipoBanco tipoBanco : new TipoBancoDAO().listarTiposBanco()){
            
                tiposBanco.add(new SelectItem(tipoBanco, tipoBanco.toString()));
                
            }
            
        }
        
        return tiposBanco;
        
    }

    public List<SelectItem> getTiposConta() {
        
        if(tiposConta == null){
        
            tiposConta = new LinkedList<SelectItem>();
            
            for(TipoConta tipoConta : new TipoContaDAO().listarTiposConta()){
            
                tiposConta.add(new SelectItem(tipoConta, tipoConta.toString()));
                
            }
            
        }
        
        return tiposConta;
        
    }

    public List<SelectItem> getVinculos() {
        
         if(vinculos == null){
        
            vinculos = new LinkedList<SelectItem>();
            
            for(Vinculo vinculo : new VinculoDAO().listarVinculos()){
            
                vinculos.add(new SelectItem(vinculo, vinculo.toString()));
                
            }
            
        }
        
        return vinculos;
        
    }
    
}
